/*
 * 这是一个在任何ASP.NET Core MVC应用中都能找到的控制器；Orchard本质上是MVC应用，当然远不止如此。
 *
 * 一个Orchard模块本质上是一个MVC区域。您可以创建不与Orchard交互的区域，只需使用标准的ASP.NET Core MVC技能。
 * 当然我们想要更多，所以让我们深入了解。
 *
 * 这里将演示如何使用一些简单的ASP.NET Core和Orchard Core服务。
 *
 * 主要功能：
 * - 演示Orchard Core控制器的基本用法
 * - 展示依赖注入、日志、通知、本地化等服务
 * - 演示自定义路由和视图集成
 */

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Localization;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using OrchardCore.DisplayManagement.Notify;
using System.Threading.Tasks;

namespace Lombiq.TrainingDemo.Controllers;

/// <summary>
/// 入门控制器 - 演示Orchard Core控制器的基本用法
/// 
/// 主要用途：
/// - 演示Orchard Core控制器的基本用法
/// - 展示依赖注入、日志、通知、本地化等服务
/// - 演示自定义路由和视图集成
/// 
/// 使用场景：
/// - 显示本地化消息
/// - 记录日志并通知用户
/// - 演示自定义路由
/// 
/// 设计原因：
/// - 展示Orchard Core控制器的标准结构
/// - 演示依赖注入和服务集成
/// - 提供本地化和通知的最佳实践
/// 
/// 设计模式：
/// - 依赖注入模式：通过构造函数注入服务
/// - 本地化模式：使用IStringLocalizer和IHtmlLocalizer
/// - 日志模式：使用ILogger记录日志
/// - 通知模式：使用INotifier发送用户消息
/// </summary>
public sealed class YourFirstOrchardCoreController : Controller
{
    private readonly INotifier _notifier;
    private readonly IStringLocalizer T;
    private readonly IHtmlLocalizer H;
    private readonly ILogger _logger;

    /// <summary>
    /// 构造函数 - 注入所需的服务依赖
    /// </summary>
    /// <param name="notifier">通知服务</param>
    /// <param name="stringLocalizer">字符串本地化器</param>
    /// <param name="htmlLocalizer">HTML本地化器</param>
    /// <param name="logger">日志服务</param>
    public YourFirstOrchardCoreController(
        INotifier notifier,
        IStringLocalizer<YourFirstOrchardCoreController> stringLocalizer,
        IHtmlLocalizer<YourFirstOrchardCoreController> htmlLocalizer,
        ILogger<YourFirstOrchardCoreController> logger)
    {
        _notifier = notifier;
        _logger = logger;
        T = stringLocalizer;
        H = htmlLocalizer;
    }

    /// <summary>
    /// 默认首页
    /// 
    /// 功能说明：
    /// - 显示本地化消息
    /// - 演示ViewData的用法
    /// 
    /// 访问方式：
    /// - URL：/Lombiq.TrainingDemo/YourFirstOrchardCore/Index
    /// </summary>
    /// <returns>返回首页视图</returns>
    public ActionResult Index()
    {
        // 使用IStringLocalizer服务进行本地化。
        ViewData["Message"] = T["Hello you!"];
        return View();
    }

    /// <summary>
    /// 通知演示页面
    /// 
    /// 功能说明：
    /// - 记录错误日志
    /// - 发送通知消息给用户
    /// - 演示自定义路由
    /// 
    /// 访问方式：
    /// - URL：/TrainingDemo/NotifyMe
    /// </summary>
    /// <returns>返回通知演示视图</returns>
    [HttpGet, Route("TrainingDemo/NotifyMe")]
    public async Task<IActionResult> NotifyMe()
    {
        // 使用ILogger记录错误日志。
        _logger.LogError("You have been notified about some error!");

        // 使用INotifier发送通知消息。
        await _notifier.InformationAsync(H["Congratulations! You have been notified! Check the error log too!"]);

        return View();
    }
}
